package com.itxh.core.handler.statement;

import com.itxh.core.config.BoundSql;
import com.itxh.core.config.ParameterMapping;
import com.itxh.core.registry.SimpleTypeRegistry;
import com.itxh.core.utils.ReflectUtils;

import java.sql.PreparedStatement;
import java.util.List;
import java.util.Map;

public class DefaultParameterHandler implements ParameterHandler{
    @Override
    public void setParameter(PreparedStatement preparedStatement, Object param, BoundSql boundSql) throws Exception{
        List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();

        // 判断入参类型，不同类型的参数，有不同的设置方法
        if(SimpleTypeRegistry.isSimpleType(param.getClass())){
            // TODO 可以针对不同类型，去设置参数
            // preparedStatement.setInt(1,param);
            // 可以使用类型处理器
            preparedStatement.setObject(1,param);
        }else if (SimpleTypeRegistry.isMap(param)){
            Map map = (Map) param;

            // 普通类
            if (parameterMappings != null){
                for (int i = 0; i < parameterMappings.size(); i++) {
                    ParameterMapping pm = parameterMappings.get(i);

                    String parameterName = pm.getParameterName();

                    // 利用反射，可以通过属性名，得到对象的属性值
                    Object value = map.get(parameterName);
                    preparedStatement.setObject(i+1,value);

                }
            }
        }else if(SimpleTypeRegistry.isList(param)){
            // TODO
        }else{
            // 普通类
            if (parameterMappings != null){
                for (int i = 0; i < parameterMappings.size(); i++) {
                    ParameterMapping pm = parameterMappings.get(i);

                    String parameterName = pm.getParameterName();

                    // 利用反射，可以通过属性名，得到对象的属性值
                    Object value = ReflectUtils.resolveValue(param,parameterName);
                    preparedStatement.setObject(i+1,value);

                }
            }
        }
    }
}
